package com.sun.jdk.lambda;

import com.sun.jdk.lambda.comparator.MyComparator;
import com.sun.jdk.lambda.domain.Person;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 需求：
 * 1. 首先对ArrayList集合中的数据进行排序
 * 2. 输出集合中的数据
 * <p>
 * 实现方法：
 * 1. 最原始的实现方法，使用Collections集合工具类中的sort方法，此方法需要给一个待排序的集合和一个Comparator比较器
 * 1.1 创建一个类实现Comparator接口，重写Comparator接口中的compare方法，在此方法中进行排序逻辑的实现
 * 2. 使用匿名内部类的形式
 * 3. 使用Lambda表达式的形式
 * 4. 使用简化的Lambda表达式的形式
 */
public class Demo03Lambda {
    public static void main(String[] args) {
        // 定义一个ArrayList集合
        List<Person> list = new ArrayList<>();
        list.add(new Person("周杰伦", 33, 175));
        list.add(new Person("刘德华", 43, 185));
        list.add(new Person("周星驰", 38, 177));
        list.add(new Person("郭富城", 23, 170));

        // 1. 最原始的方法
        System.out.println("原始方法实现排序");
        Collections.sort(list, new MyComparator());
        for (Person person : list) {
            System.out.println(person);
        }

        // 2. 使用匿名内部类的形式
        System.out.println("匿名内部类的形式实现排序");
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        for (Person person : list) {
            System.out.println(person);
        }

        // 3. Lambda表达式的形式实现排序
        System.out.println("Lambda形式实现排序");
        Collections.sort(list, (Person o1, Person o2) -> {
            return o1.getAge() - o2.getAge();
        });
        for (Person person : list) {
            System.out.println(person);
        }

        // 4. 简化的Lambda表达式的形式实现排序
        System.out.println("简化的Lambda表达式的形式实现排序");
        Collections.sort(list, (o1, o2) -> {
            return o1.getAge() - o2.getAge();
        });
        for (Person person : list) {
            System.out.println(person);
        }

        // 5. 更加简化的Lambda形式实现排序
        System.out.println("更加简化的Lambda形式实现排序");
        Collections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());
        for (Person person : list) {
            System.out.println(person);
        }

        // 6. 有待学习的方法
        System.out.println("有待学习的方法形式实现排序");
        Collections.sort(list, Comparator.comparingInt(Person::getAge));
        for (Person person : list) {
            System.out.println(person);
        }
        
        // 7.简化写法
        System.out.println("更加简化的写法");
        Collections.sort(list, Comparator.comparingInt(Person::getAge));
        list.forEach(System.out::println);
    }
}
